package main

import "fmt"

func Prob1() {
	var v1 string = "name"
	// 创建指针， 指向v1内存地址
	var pr1 *string = &v1
	// 创建另一个指针，指向pr1的值  的内存地址
	var pr2 *string = pr1
	// 创建第三个指针，指向pr2的值  的内存地址
	var pr3 *string = pr2

	fmt.Printf("v1:%s, mem:%p\n", v1, &v1)
	fmt.Printf("pr1:%p, mem:%p\n", pr1, &pr1)
	fmt.Printf("pr2:%p, mem:%p\n", pr2, &pr2)
	fmt.Printf("pr3:%p, mem:%p\n", pr3, &pr3)

	// 问题 为什么在*前面加* 和 只加一个*他们的内存地址是有区别的
	// 指针指向另一个指针时 只加一个*(pr2 *string := pr1)  指向的是另一个指针的值
	// 指针指向另一个指针时 加上两个*(pr2 **string := &pr1)  指向的是另一个指针的内存地址
	// 所以指针1指向指针2，同时指针2指向了指针3， 这样指针1就需要加三个*， 以此类推

	var v2 string = "name"
	// 创建指针， 指向v1内存地址
	var pr4 *string = &v2
	// 创建另一个指针，指向pr1指针的内存地址
	var pr5 **string = &pr4
	// 创建第三个指针，指向pr2的内存地址
	var pr6 ***string = &pr5

	fmt.Printf("v1:%s, mem:%p\n", v2, &v2)
	fmt.Printf("pr1:%p, mem:%p\n", pr4, &pr4)
	fmt.Printf("pr2:%p, mem:%p\n", pr5, &pr5)
	fmt.Printf("pr3:%p, mem:%p\n", pr6, &pr6)

}
